home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 1998 September / Macworld (1998-09).dmg / Shareware World / Info / 1984 AOLM Issue 4 / 1984 AOLM Issue 4.rsrc / TEXT_135.txt < prev    next >
Text File  |  1998-06-25  |  10KB  |  246 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15. How To Write An Award‚ÄìWinning Script
  16. Part Three
  17.  
  18. Welcome to the third part of 1984-OnLine‚Äôs thrilling series on AppleScript. For those who haven‚Äôt read the first two parts, I‚Äôm afraid that I haven‚Äôt the space to go over what was covered then. They can be found in Issues 1 and 2 of 1984 OnLine at http://www.1984-online.com.
  19.  
  20. No messing about at the back, let‚Äôs get down to business.
  21.  
  22. Control Statements
  23. Although they may sound daunting, they are nothing to be feared. If you‚Äôve followed the first two parts of this AppleScript series then you will have already used them, for example ‚Äòif‚Ķ then‚Ķ else‚Ķ‚Äô is a control statement, as is ‚Äòtell‚Ķ end tell‚Äô.
  24.  
  25. A definition would be ‚Äòstructured commands that let you control the flow of the script‚Äô. Their structure makes them easy to use, because they always follow the same pattern. Much like the MacOS, really: you can learn one method of doing something (like using menus) that is consistent across all applications.
  26.  
  27. Here are some ‚Äòcontrol statements‚Äô:
  28.  
  29. tell‚Ķ end tell
  30. if‚Ķ then‚Ķ else‚Ķ end if
  31. repeat‚Ķ end repeat
  32. try... on error... end try
  33.  
  34. tell‚Ķ end tell
  35. This tells an application to do something.
  36.  
  37. if‚Ķ then‚Ķ else‚Ķ end if
  38. This checks a condition, which we learned about in Part 2. If the condition is true then do something otherwise (else) do something else (end if).
  39.  
  40. repeat‚Ķ end repeat
  41. This will loop through all commands between repeat and end repeat. A condition (like in the ‚Äòif‚Äô statement) is used to control the repeat, and repeats have an extra word after ‚Äòrepeat‚Äô to control when the loop should stop. 
  42. Examples:
  43.  
  44. repeat until myVariable equals 5
  45. repeat while myVariable is less than 5
  46. repeat with myItem in myList
  47.  
  48. We‚Äôll learn more about some of these later.
  49.  
  50. try... on error... end try
  51. This is used to handle errors. You tell an application to ‚Äòtry‚Äô to do something, ‚Äòon error‚Äô (when an error occurs) do something. For example, say your script is using the Finder to copy a file onto a floppy disk and the disk is damaged. Without using a ‚Äòtry‚Äô in your script, the Finder would display an error and the script would fail. By using ‚Äòtry‚Äô you can control what your script does when it hits an error, such as display a nice, friendly message to advise corrective action:
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63.  
  64. We shall be looking at how to code control statements after we‚Äôve looked at subroutines. 
  65.  
  66. Subroutines
  67. Look, like it or lump it AppleScript is a computer programming language. And it‚Äôs a very clever very sophisticated language, too. I don‚Äôt believe I‚Äôve ever seen an easier programming language to write that allows you to do so much. Subroutines might sound scary, but they‚Äôre easy, honest.
  68.  
  69. A subroutine lets you chop up your script into smaller, reusable bits. A subroutine starts with ‚Äòon‚Äô and ends with ‚Äòend‚Äô. This is best illustrated with an example:
  70.  
  71. on addVat(theAmount)
  72.     set theAmount to theAmount * 1.175
  73.     return theAmount
  74. end addVat
  75.  
  76. Line by line:
  77.  
  78. on addVat(theAmount)
  79.  
  80. The first line of a subfunction starts with ‚Äòon‚Äô then the subfunction‚Äôs name: addVat. Following that there must be brackets, and optionally these may contain one or more parameters, separated by commas. Don‚Äôt panic, parameters are just variables. Parameters are ‚Äòpassed‚Äô to subroutines because subroutines cannot see any variables that have not been defined within them, apart from properties and global variables (we haven‚Äôt ‚Äòdone‚Äô them yet) unless they are passed to it by another subroutine. This parameter is a variable called ‚ÄòtheAmount‚Äô.
  81.  
  82. set theAmount to theAmount * 1.175
  83.  
  84. This does a mathematical calculation (adds VAT -- Value Added Tax -- at 17.5%) to theAmount.
  85.  
  86. return theAmount
  87.  
  88. This ‚Äòreturns‚Äô the variable ‚ÄòtheAmount‚Äô to the  subroutine that called the addVat subroutine. Whatever is returned using ‚Äòreturn‚Äô becomes ‚Äòthe result‚Äô. In effect, your subroutine returns a result just like the result returned when you use the ‚Äòdisplay dialog‚Äô command.
  89.  
  90. end addVat
  91.  
  92. Ends the subroutine structure.
  93.  
  94. This brings us nicely onto‚Ķ
  95.  
  96. Droplets
  97. No, not the splendid Mac sound, or anything of the ‚Äòspilt drink‚Äô variety. Droplets are scripts (or Applets, as technonerds call them) that you can drop files or folders on in the Finder. If you look in your Automated Tasks folder in the AppleScript folder, you‚Äôll see loads of them, and they have icons like this:
  98.  
  99.  
  100.  
  101. You turn an ordinary script (or Applet) into a Droplet by using a subroutine called ‚Äòon open‚Äô. Only if this subroutine is in the script will the Script Editor automatically save a script as a Droplet. The ‚Äòon open‚Äô statement works much the same as other subroutines.
  102.  
  103. Example (pinched from Apple‚Äôs ‚ÄòAdd Alias to Apple Menu script‚Äô):
  104.  
  105. on open theList
  106.     MakeAppleAliases(theList)
  107. end open
  108.  
  109. Note how the parameter ‚ÄòtheList‚Äô is not enclosed in brackets after ‚Äòon open‚Äô. This is because parameters in brackets are optional, whereas ‚Äòon open‚Äô is only going to be used when an item is dropped onto the script‚Äôs icon in the finder, and it‚Äôs a list of the items (files or folders) that were dropped which becomes the parameter.
  110.  
  111. However, it‚Äôs always important when writing scripts to think out every scenario. If a Droplet is normally opened by dragging files onto it, what would happen when the user double clicks the file?
  112.  
  113. Well, if all the commands are contained within the ‚Äòon open‚Äô subroutine, then nothing will happen. Not unless you also write an ‚Äòon run‚Äô subroutine outside the ‚Äòon open‚Äô subroutine (Script Editor won‚Äôt let you write it anywhere else).
  114.  
  115. The ‚Äòon run‚Äô subroutine works just like ‚Äòon open‚Äô except it‚Äôs only used when a script is double-clicked, and it has no parameters.
  116.  
  117.  
  118. The Practical Bit
  119. This month our practical bit isn‚Äôt terribly practical. We‚Äôve going to look at Apple‚Äôs ‚ÄòAdd Alias To Apple Menu‚Äô script / droplet, which conveniently uses just about everything we‚Äôve discussed in this article so far. It‚Äôs just as important to be able to read a script as it is to write it, and I don‚Äôt suppose you‚Äôre going to find a better written script than an Apple one.
  120.  
  121. The script begins:
  122.  
  123.  
  124.  
  125.  
  126.  
  127.  
  128.  
  129.  
  130.  
  131.  
  132.  
  133.  
  134.  
  135.  
  136. Notice how all the control statements (‚Äòon‚Äô, ‚Äòtell‚Äô, ‚Äòif‚Äô) in this subfunction (‚Äòon run‚Äô) have matching ‚Äòend‚Äô statements (‚Äòend run‚Äô, ‚Äòend tell‚Äô, ‚Äòend if‚Äô), sand also notice how the Script Editor indents each of these statements by about half an inch. This helps you to ensure that your control statements have matching ‚Äòend‚Äô statements.
  137.  
  138. The purpose of the statement ‚Äòon run‚Äô in this script is to set ‚ÄòtheList‚Äô -- a list variable containing a list of files to be processed -- to selected icons in the Finder. This can only be used when an icon is selected in the Finder and the script is run from the Apple menu. However it also checks that if only one icon is selected, and its name is ‚ÄúAdd Alias To Apple Menu‚Äù (the name of the script itself), then it sets the list to {} -- empty. Having the ‚ÄúAdd Alias To Apple Menu‚Äù as the only icon selected in the Finder would be the case, should the droplet have just been double‚Äìclicked.
  139.  
  140. Following that check, the script then calls subroutine ‚ÄòMakeAppleAliases‚Äô using the list variable called ‚ÄòtheList‚Äô as its parameter.
  141.  
  142. on open theList
  143.     MakeAppleAliases(theList)
  144. end open
  145.  
  146. The above is only run when items are dropped onto the script‚Äôs icon in the Finder, and therefore the ‚Äòon run‚Äô validation is not required. So it immediately calls the ‚ÄòMakeAppleAliases‚Äô subroutine using ‚ÄòtheList‚Äô, as above. 
  147.  
  148. Here is the MakeAppleAliases subroutine. Notice ‚ÄòtheList‚Äô is passed in brackets:
  149.  
  150. on MakeAppleAliases(theList)
  151.     set NoItemsSelectedFlag to true -- initialise the flag
  152.  
  153. The above created a variable called ‚ÄòNoItemsSelectedFlag‚Äô and sets it to true.
  154.  
  155.     tell application "Finder"
  156.         repeat with x in theList
  157.             set NoItemsSelectedFlag to false
  158.  
  159. In the three lines above, the script uses the ‚Äòtell‚Äô control statement to ‚Äòtell application ‚ÄúFinder‚Äù to ‚Äòrepeat with x in theList‚Äô -- another control statement.
  160.  
  161. This repeat loop will automatically loop through every item in theList. The variable ‚Äòx‚Äô will refer to the current item of the list in the script.
  162.  
  163. Notice that once the script is in the list it sets the variable ‚ÄòNoItemsSelectedFlag‚Äô to ‚Äòfalse‚Äô.
  164.  
  165.             try
  166.                 make new alias file at apple menu items folder to x
  167.             on error
  168.                 error "There was an error making the alias."
  169.             end try
  170.  
  171. Now we have a ‚Äòtry‚Äô control statement, which is asking the Finder to ‚Äòtry [to] make a new alias file at apple menu items folder to x‚Äô. If it hits an error then it‚Äôll beep and show a message.
  172.  
  173.         end repeat
  174.     end tell
  175.  
  176. End the ‚Äòrepeat‚Äô, end the ‚Äòtell‚Äô.
  177.  
  178.     if NoItemsSelectedFlag then
  179.         display dialog "You have not selected an item to create an alias." & return & return & ¬¨
  180.             "Select an item and then run this application " & ¬¨
  181.             "from the Apple menu." & return & return & ¬¨
  182.             "An alias can also be created by dragging an item onto this " & ¬¨
  183.             "application." buttons "OK" default button 1
  184.  
  185. If the script never entered the ‚Äòrepeat‚Äô loop, then the variable ‚ÄòNoItemsSelectedFlag‚Äô would remain true. If this is so, then the script displays a dialogue box with the above message.
  186.  
  187.     else
  188.         if result is not {} then
  189.             display dialog "The Alias(es) have been added to the Apple menu." buttons {"OK"} default button 1
  190.         else
  191.             display dialog "Aliases to PowerTalk items are not supported." buttons {"OK"} default button 1
  192.         end if
  193.     end if
  194. end MakeAppleAliases
  195.  
  196. Otherwise (if items were selected), and ‚Äòthe result‚Äô is not blank then the script will display a nice message confirming that everything ran successfully. If ‚Äòthe result‚Äô is blank, a message is displayed about PowerTalk items not being supported.
  197.  
  198. That‚Äôs it for this month. We‚Äôve learned about control statements, control statements and some control statements. We‚Äôve also learned about subroutines, how to make droplets (by using ‚Äòon open‚Äô), and some control statements too.
  199.  
  200. Here‚Äôs a summary of the technical terms used in this month‚Äôs article:
  201.  
  202.  
  203.  
  204.  
  205.  
  206.  
  207.  
  208.  
  209.  
  210.  
  211.  
  212.  
  213.  
  214.  
  215.  
  216.  
  217.  
  218.  
  219.  
  220.  
  221.  
  222.  
  223.  
  224.  
  225.  
  226.  
  227.  
  228.  
  229.  
  230.  
  231.  
  232.  
  233.  
  234.  
  235.  
  236.  
  237. As ever, next month we shall put all this into practise, and learn some more AppleScript features along the way.
  238.  
  239. Comments to:
  240. helpdesk@1984-online.com
  241.  
  242.  
  243.  
  244.  
  245.  
  246.